/*
 * Fichier source C++ du projet menulib
 *
 * Cible : PSP
 * Auteur : BuLLeKeUp
 * Date de création : 17/03/2012
 * Date de dernière modification : 17/03/2012
 *
 * Ce projet est sous license GNU GPL v3. Consultez la license associée dans le repertoire doc/gplv3.txt
 * ou rendez vous sur http://www.gnu.org/copyleft/gpl.html
 *
 * Nom du fichier : main.cpp
 *
 * Description : Fichier d'en-tête de la classe permettant la création d'un menu pour affichage
 *
 */

#ifndef HEADER_MENU_INCLUDED
#define HEADER_MENU_INCLUDED

#include <psptypes.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <string.h>
#include <pspthreadman.h>
#include <stdlib.h>
#include "defines.h"
#include "../generic/defines.h"

#define LINE_NUMBER 34
#define COLUMN_NUMBER 68

/* 
 * Classe d'implémentation de la gestion des menus
 * Possède une fonction d'affichage du menu ainsi que des fonctions de modification des couleurs
 */

class menu {
    
public:
    /*
     * Constructeur de la classe sans paramètres
     */
    menu();
    /*
     * Constructeur de la classe prend en paramètre
     * -> La liste des titres
     * -> Le nombre de titres
     * -> Le titre du header
     */
    menu(titleOptions *p_titles, int p_nbTitles, char *p_headerTitle);
     /*
     * Constructeur de la classe prend en paramètre
     * -> La liste des titres
     * -> Le nombre de titres
     * -> Le titre du header
     * -> La couleur de fond (background)
     */
    menu(titleOptions *p_titles, int p_nbTitles, char *p_headerTitle, u32 p_backgroundColor);
    menu(const menu& orig);
    
    /*
     * Destructeur de la classe
     */
    virtual ~menu();
    
    // Fonctions publiques de la classe
    
    /*
     * Choix de la couleur du titre
     */
    int setTitleColor(int p_titleNb, u32 p_titleColor);
    
    /*
     * Choix de la couleur des options
     */
    int setOptionsColor(int p_titleNb, u32 p_optionColor);
    
    /*
     * Choix de la couleur de fond
     */
    int setBackgroundColor(u32 p_backgroundColor);
    
    /*
     * Affichage du menu à l'écran
     */
    int printMenu();
    
    /*
     * Accesseur récupérant l'option actuellement selectionnée
     */
    int getOptionSelected();
    
    /*
     * Accesseur récupérant le titre actuellement selectionné
     */
    int getTitleSelected();
    
    /*
     * Accesseur récupérant la liste des titres du menu
     */
    titleOptions *getTitles();
    
    /*
     * Accesseur récupérant la structure contenant les informations d'appui sur un bouton
     */
    SceCtrlData *getPad();
    
    /*
     * Accesseur récupérant le nombre de titres
     */
    int getNbTitles();
    
    int setOptionSelected(int p_optionSelected);
    int setTitleSelected(int p_titleSelected);
    
    int createButtonThread();
    int printValues();
    
    int gotoOption();
    
private:
    
    // Fonctions privées de la classe
    int printHeader();
    int printTitle(int p_titleNb, int *p_currentLine);
    int initScreen();
    int terminateButtonThread();
    int drawCursor(int p_line);
    
private:
    functionPointer* functions;
    int titleSelected;
    int optionSelected;
    int nbTitles;
    SceUID buttonThreadID;
    titleOptions *titles;
    u32 backgroundColor;
    char separateLine[69];
    char cursor[3];
    char *headerTitle;
};

#endif	/* MENU_H */

